package bancosys.tec.persist.validator;

import java.util.Collection;
import java.util.List;

import bancosys.tec.exception.BusinessException;
import bancosys.tec.exception.CompoundMessageHolder;
import bancosys.tec.exception.LocalizedMessageHolder;

/**
 * @created Feb 6, 2007
 * @author Gustavo Almeida
 */
public class ValidationException extends BusinessException {

    /**
     * Construtor.
     * 
     * @param localizedMessageHolder com a mensagem a ser incluída no topo das mensagens
     * @param validationErrors erros de validação.
     */
    public ValidationException(final LocalizedMessageHolder localizedMessageHolder, List<ValidationError> validationErrors) {
        super(new CompoundMessageHolder("\n") {{ addMessage(localizedMessageHolder); }});
        this.addErrors(validationErrors);
    }
    
    /**
     * Construtor.
     * 
     * @param validationError erro de validação.
     */
    public ValidationException(ValidationError validationError) {
        super(new CompoundMessageHolder("\n"));
        this.addError(validationError);
    }

    /**
     * Construtor.
     * 
     * @param validationErrors erros de validação.
     */
    public ValidationException(List<ValidationError> validationErrors) {
        super(new CompoundMessageHolder("\n"));
        this.addErrors(validationErrors);
    }

    /**
     * Adiciona um erro de validação.
     * 
     * @param validationError erro de validação.
     */
    public void addError(ValidationError validationError) {
        this.getCompoundMessageHolder().addMessage(validationError.getLocalizedMessageHolder());
    }

    /**
     * Adiciona varios erros de validação.
     * 
     * @param validationErrors erros de validação.
     */
    public void addErrors(Collection<ValidationError> validationErrors) {
        for (ValidationError error : validationErrors) {
            this.getCompoundMessageHolder().addMessage(error.getLocalizedMessageHolder());
        }
    }

    /**
     * Devolve os erros de validação.
     * 
     * @return erros de validação.
     */
    public List<LocalizedMessageHolder> getErrors() {
        return this.getCompoundMessageHolder().getMessages();
    }

    /**
     * Obtém o holder de muitas mensagens
     * 
     * @return CompoundMessageHolder
     */
    private CompoundMessageHolder getCompoundMessageHolder() {
        return (CompoundMessageHolder) super.getLocalizedMessageHolder();
    }
}
